home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / Add-Ons / Avara / Custom Scorer / source / Scorer.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-06-02  |  8.0 KB  |  297 lines  |  [TEXT/CWIE]

  1. #include <A4Stuff.h>
  2. #include "AvaraScoreInterface.h"
  3.  
  4. #define kLineLength                50
  5. #define kDefaultChatBufferSize    1024
  6. void UpdateBuffer (void);
  7.  
  8. typedef enum {
  9.     kFileNotYetSelected,
  10.     kFileSelected,
  11.     kFileCancelled
  12. } fileHandlingStatus;
  13.  
  14.  
  15. fileHandlingStatus            fileFlag = kFileNotYetSelected;    
  16. StandardFileReply            theReply;
  17. Str63                        thePrompt = "\pLog results to:", theName = "\pAvara Results Log";
  18.  
  19. Str63                        players[6];
  20. Str255                        tempNumStr;
  21.  
  22. char                        textBuf[(kLineLength + 1) * 7 + 1] = "Name                Total Shot Grnd Misl OthrLives\r",
  23.                                 cr[1] = "\r",
  24.                                 sp[1] = " ",
  25.                                 livesStr[6] = "••••+";
  26.  
  27. short                        totalPoints[6], shotPoints[6], grenadePoints[6], missilePoints[6], otherPoints[6]
  28.                                 , lives[6], playerJoined[6], noPlayers,
  29.                                 chatBufPtr = 0, chatBufLength = 0;
  30.  
  31. Handle                        chatBuffer = NULL;
  32.  
  33. unsigned long                currTime, nextTickCount;
  34.                             
  35. ScoreInterfaceReasons        lastCall;
  36.                                 
  37. pascal void    main(ScoreInterfaceRecord *rec)
  38. {
  39.  
  40.     short                    fileRefNum, i;
  41.     long                    textSize;
  42.     OSErr                    myErr;
  43.     
  44. //    Handle                    tempTextHandle;
  45.     
  46.     EnterCodeResource();
  47.  
  48.     switch (rec->command) {
  49.         case ksiLevelStarted:
  50.             if (!chatBufLength) {
  51.                 chatBuffer = NewHandle(kDefaultChatBufferSize);
  52.                 if (chatBuffer) {
  53.                     chatBufLength = kDefaultChatBufferSize;
  54.                 } else {
  55.                     chatBufLength = -1;
  56.                 }
  57.             } else {
  58.                 if (chatBuffer) {
  59.                     // write buffer
  60.                 }
  61.             }
  62.             for (i=0; i<6; i++) {
  63.                 totalPoints[i] = shotPoints[i] = grenadePoints[i] = missilePoints[i] = otherPoints[i] = playerJoined[i] = lives[i] = 0;
  64.             }
  65.             noPlayers = 0;
  66.             break;
  67.         case ksiPlayerIntro:
  68.             lastCall = ksiPlayerIntro;
  69.             if (rec->playerID == -1) {
  70.                 ExitCodeResource();
  71.                 return;
  72.             }
  73.             textSize = *(rec->playerName) + 1;
  74.             if (textSize > 63) textSize = 63;
  75.             BlockMoveData (rec->playerName,&(players[rec->playerID]), textSize);
  76.             playerJoined[rec->playerID] = 1;
  77.             lives[rec->playerID] = rec->playerLives;
  78.             noPlayers++;
  79.             break;
  80.         case ksiScore:
  81.             lastCall = ksiScore;
  82.             if (rec->playerID == -1) {
  83.                 ExitCodeResource();
  84.                 return;
  85.             }
  86.             switch (rec->scoreReason) {
  87.                 case ksiShotHit:
  88.                     shotPoints[rec->playerID] += rec->scorePoints;
  89.                     break;
  90.                 case ksiGrenadeHit:
  91.                     grenadePoints[rec->playerID] += rec->scorePoints;
  92.                     break;
  93.                 case ksiMissileHit:
  94.                     missilePoints[rec->playerID] += rec->scorePoints;
  95.                     break;
  96.                 default:
  97.                     otherPoints[rec->playerID] += rec->scorePoints;
  98.                     break;
  99.             }
  100.             totalPoints[rec->playerID] += rec->scorePoints;
  101.             lives[rec->playerID] = rec->playerLives;
  102.             if (TickCount() < nextTickCount) {
  103.                 ExitCodeResource();
  104.                 return;
  105.             }
  106.             nextTickCount = TickCount() + 60;
  107.             UpdateBuffer();
  108.                 textSize = ((noPlayers + 1) * (kLineLength + 1)) + 1;
  109.             if (textSize != GetHandleSize (rec->resultsHandle)) {
  110.                 SetHandleSize (rec->resultsHandle, textSize);
  111.             }
  112.             BlockMoveData (&textBuf, *(rec->resultsHandle), textSize);
  113.             rec->resultsChanged = true;
  114.             break;
  115.         case ksiResultsUpdate:
  116.             if (lastCall != ksiResultsUpdate) {
  117.                 UpdateBuffer();
  118.  
  119.                 textSize = ((noPlayers + 1) * (kLineLength + 1)) + 1;
  120.                 if (textSize != GetHandleSize (rec->resultsHandle)) {
  121.                     SetHandleSize (rec->resultsHandle, textSize);
  122.                 }
  123.                 BlockMoveData (&textBuf, *(rec->resultsHandle), textSize);
  124.                 rec->resultsChanged = true;
  125.             } else {                
  126.                 rec->resultsChanged = false;
  127.             }
  128.             lastCall = ksiResultsUpdate;
  129.             break;
  130.         case ksiConsoleText:
  131.             if (!chatBufLength) {
  132.                 chatBuffer = NewHandle(kDefaultChatBufferSize);
  133.                 if (chatBuffer) {
  134.                     chatBufLength = kDefaultChatBufferSize;
  135.                 } else {
  136.                     chatBufLength = -1;
  137.                 }
  138.             }
  139.             if (chatBuffer) {
  140.                 textSize = *(rec->consoleLine);
  141.                 if (chatBufPtr + textSize > chatBufLength) {
  142.                     SetHandleSize(chatBuffer, chatBufLength + kDefaultChatBufferSize);
  143.                     chatBufLength = GetHandleSize(chatBuffer);
  144.                 }
  145.                 if (chatBufPtr + textSize < chatBufLength) {
  146.                     *(*chatBuffer + chatBufPtr) = *sp;
  147.                     BlockMoveData ((rec->consoleLine) + 1, *chatBuffer + chatBufPtr + 1, textSize);
  148.                     *(*chatBuffer + chatBufPtr + textSize + 1) = *cr;
  149.                     chatBufPtr += textSize + 2;
  150.                 }
  151.             }
  152.             break;
  153.         case ksiLevelEnded:
  154.             lastCall = ksiLevelEnded;
  155.             switch (fileFlag) {
  156.                 case kFileCancelled:
  157.                     ExitCodeResource();
  158.                     return;
  159.                     break;
  160.                 case kFileNotYetSelected:
  161.                     StandardPutFile( (ConstStr255Param) &thePrompt, (ConstStr255Param) &theName, &theReply);
  162.                         if (!theReply.sfGood) {
  163.                         fileFlag = kFileCancelled;
  164.                         ExitCodeResource();
  165.                         return;
  166.                      }
  167.                     if (!theReply.sfReplacing) {
  168.                         myErr = FSpCreate(&theReply.sfFile, 'R*ch', 'TEXT', theReply.sfScript);
  169.                         if (myErr != noErr) {
  170.                             ExitCodeResource();
  171.                             return;
  172.                         }
  173.                     }
  174.                     fileFlag = kFileSelected;
  175.  
  176.                 case kFileSelected:
  177.                     myErr = FSpOpenDF (&theReply.sfFile, fsWrPerm, &fileRefNum);
  178.                     if (myErr != noErr) {
  179.                         ExitCodeResource();
  180.                         return;
  181.                     }
  182.  
  183.                     myErr = SetFPos (fileRefNum, fsFromLEOF, 0);
  184.                     if (myErr != noErr) {
  185.                         ExitCodeResource();
  186.                         return;
  187.                     }
  188.  
  189.                     textSize = *(rec->levelName) + 1;
  190.                     BlockMoveData (rec->levelName,&tempNumStr, textSize);
  191.                     textSize--;
  192.                     /* myErr = */ FSWrite (fileRefNum, &textSize, tempNumStr + 1);
  193.                     textSize = 1;
  194.                     /* myErr = */ FSWrite (fileRefNum, &textSize, cr);
  195.  
  196.                     GetDateTime (&currTime);
  197.                     DateString (currTime, longDate, tempNumStr, nil);
  198.                     textSize = *tempNumStr;
  199.                     /* myErr = */ FSWrite (fileRefNum, &textSize, tempNumStr + 1);
  200.                     textSize = 1;
  201.                     /* myErr = */ FSWrite (fileRefNum, &textSize, sp);
  202.                     TimeString (currTime, true, tempNumStr, nil);
  203.                     textSize = *tempNumStr;
  204.                     /* myErr = */ FSWrite (fileRefNum, &textSize, tempNumStr + 1);
  205.                     textSize = 1;
  206.                     /* myErr = */ FSWrite (fileRefNum, &textSize, cr);
  207.  
  208.                     textSize = chatBufPtr;
  209.                     HLock(chatBuffer);
  210.                     /* myErr = */ FSWrite (fileRefNum, &textSize, *chatBuffer);
  211.                     HUnlock(chatBuffer);
  212.                     chatBufPtr = 0;
  213.  
  214.                     UpdateBuffer();
  215.                     textSize = ((noPlayers + 1) * (kLineLength + 1)) + 1;
  216.                     /* myErr = */ FSWrite (fileRefNum, &textSize, textBuf);
  217.                     myErr = FSClose (fileRefNum);
  218.             }
  219.             break;
  220. /* disabled as we leave Avara to update the custom results window.
  221.  
  222.         case ksiResultsDraw:
  223.             resHand = GetResource ('PICT', 3456);
  224.             if (resHand) {
  225.                 DrawPicture ((PicHandle)resHand, &(rec->resultsRect));
  226.                 ReleaseResource (resHand);
  227.             }
  228.             break;
  229. */
  230.     }
  231.     ExitCodeResource();
  232. }
  233.  
  234. void UpdateBuffer () {
  235.  
  236.     short                    i, j, k, lineStart, strSize;
  237.  
  238.     Ptr                        sourcePtr, destPtr;
  239.  
  240.  
  241.     j = 0;
  242.     for (i = 0; i < 6; i++) {
  243.         if (playerJoined[i]) {
  244.             j++;
  245.             lineStart = (kLineLength + 1) * j;
  246.             for (k = 0;k < kLineLength;k++) {
  247.                 *(textBuf + lineStart + k) = (char)' ';
  248.             }
  249.             *(textBuf + lineStart + kLineLength) = (char)'\r';
  250.             
  251.             if (*players[i] > 20) {
  252.                 strSize = 20;
  253.             } else {
  254.                 strSize = *players[i];
  255.             }
  256.             sourcePtr = (char*) players[i] + 1;
  257.             destPtr = textBuf + lineStart;
  258.             BlockMoveData (sourcePtr, destPtr, strSize);
  259.  
  260.             NumToString ((long)totalPoints[i], tempNumStr);
  261.             sourcePtr = (char*) tempNumStr + 1;
  262.             destPtr = textBuf + lineStart + 25 - *(tempNumStr);
  263.             BlockMoveData (sourcePtr, destPtr, *(tempNumStr));
  264.  
  265.             NumToString ((long)shotPoints[i], tempNumStr);
  266.             destPtr = textBuf + lineStart + 30 - *(tempNumStr);
  267.             BlockMoveData (sourcePtr, destPtr, *(tempNumStr));
  268.  
  269.             NumToString ((long)grenadePoints[i], tempNumStr);
  270.             destPtr = textBuf + lineStart + 35 - *(tempNumStr);
  271.             BlockMoveData (sourcePtr, destPtr, *(tempNumStr));
  272.  
  273.             NumToString ((long)missilePoints[i], tempNumStr);
  274.             destPtr = textBuf + lineStart + 40 - *(tempNumStr);
  275.             BlockMoveData (sourcePtr, destPtr, *(tempNumStr));
  276.  
  277.             NumToString ((long)otherPoints[i], tempNumStr);
  278.             destPtr = textBuf + lineStart + 45 - *(tempNumStr);
  279.             BlockMoveData (sourcePtr, destPtr, *(tempNumStr));
  280.                     
  281.             if (lives[i] > 0) {
  282.                 if (lives[i] > 5) {
  283.                     strSize = 5;
  284.                 } else {
  285.                     strSize = lives[i];
  286.                 }
  287.                 sourcePtr = (char*) livesStr;
  288.                 destPtr = textBuf + lineStart + 45;
  289.                 BlockMoveData (sourcePtr, destPtr, strSize);
  290.             }
  291.  
  292.         }            
  293.     }
  294.     *(textBuf + lineStart + (kLineLength + 1)) = (char)'\r';
  295.     *(textBuf + lineStart + (kLineLength + 2)) = (char)0;
  296. }
  297.